package com.cskaoyan.javase.oop3._0abstract._2exercise;

/**
 * 1. 编码练习
 * > 公司正在开发一套员工管理系统，需要对公司内部存在的员工进行管理
 * > 公司将员工分为三类，普通员工负责杂项工作，程序员负责技术开发，经理负责统筹规划
 * > 普通员工包含3个属性：姓名、工号以及工资，行为是工作
 * > 程序员包含3个属性：姓名、工号以及工资，行为是工作和加班（overtime work）
 * > 经理包含4个属性：姓名、工号、工资以及奖金（bonus），行为是工作
 * - 请使用所学的知识设计该员工系统
 * 要求类中提供必要的方法进行属性访问（description）
 *
 * 这个案例中，定义抽象父类会是更好的选择。因为如果使用一个普通员工作为顶层父类，那么它的修改会影响子类，这样不好。
 *
 *
 * @since 10:50
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        AbstractStaff as;
        as = new NormalStaff("张三", 1, 10000);
        as.work();
        as.printStaff();
        as = new Programmer("李四", 2, 100000);
        as.work();
        as.printStaff();
        ((Programmer) as).overtimeWork();
        as = new Manager("老王", 3, 100000, 1000000);
        as.work();
        as.printStaff();
    }
}

// 抽象员工类
abstract class AbstractStaff {
    // 姓名、工号以及工资
    private String name;
    private int id;
    private double salary;

    // 共有的行为
    public abstract void work();

    // 构造器
    public AbstractStaff(String name, int id, double salary) {
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    // 定义方法,打印属性
    public void printStaff() {
        System.out.println("工号为:" + id + "的员工" + name + ",他的工资是:" + salary);
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public double getSalary() {
        return salary;
    }
}

// 普通员工类
class NormalStaff extends AbstractStaff {
    @Override
    public void work() {
        System.out.println("杂项工作");
    }

    public NormalStaff(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Programmer extends AbstractStaff {

    @Override
    public void work() {
        System.out.println("系统开发");
    }

    // 程序员有自己独有的行为
    public void overtimeWork() {
        System.out.println("996");
    }

    public Programmer(String name, int id, double salary) {
        super(name, id, salary);
    }
}

class Manager extends AbstractStaff {

    private double bonus;

    @Override
    public void work() {
        System.out.println("统筹规划");
    }

    public Manager(String name, int id, double salary, double bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    @Override
    public void printStaff() {
        System.out.println("工号为:" + getId() + "的员工" + getName() + ",他的工资是:" + (getSalary() + bonus));
    }
}